package cn.tedu.spring.security.security;

import cn.tedu.spring.security.pojo.User;
import cn.tedu.spring.security.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

/**
 * UserDetailsService接口：是Spring Security提供的一个接口，用于与外部的数据源（数据库）进行交互
 * 它的作用是根据用户提供的信息查询用户的认证信息
 *
 * 关于UserDetailsService 自动配置的规则：
 * 1.Spring Boot提供了基于条件注解的自动配置规则
 * 2.如果没有任何的UserDetailsService，则认证管理器会创建基于内存的UserDetailsService
 * 3.Spring Security的认证管理器会自动寻找UserDetailsService类型组件作为认证信息来源
 * 4.如果需要手动配置，就调用builder.userDetailsService() 进行手动配置，如果添加了手动配置，会导致自动配置失效
 *
 */
@Component
public class UserDetailsServiceImpl implements UserDetailsService {
    /**
     * 实现这个方法，以此来根据用户名获取用户的详情信息，将其获取的用户详情信息处理成UserDetails 对象，会被用于后续的身份验证
     * 和授权操作
     */
    @Autowired IUserService userService;
    @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        User user = userService.getUserByUsername(s);
        UserDetails details = new UserDetailsImpl(user);
        return details;
    }
}
